
package dailynewsreader.controller;

import dailynewsreader.model.RSSEntry;
import dailynewsreader.model.RSSFeed;
import java.io.File;
import java.io.FileNotFoundException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * Elmenti és visszatölti a mentett bejegyzéseket a cache fájlba
 * 
 * @author Zen
 */
public class FileOperations {
    
    /**
     * A cache-ként szolgáló file
     */
    private static String FILE_NAME = "cache.xml";
    
    /**
     * Az egyetlen létező példány
     */
    private static FileOperations instance;
    
    /**
     * A cache file
     */
    private File file;
    
    /**
     * Konstruktor
     */
    private FileOperations() {
        this.file = new File(FILE_NAME);
    }
    
    /**
     * Előállítja/visszaadja az egyetlen létező példányt 
     * 
     * @return Az egyetlen létező példány
     */
    public static FileOperations getInstance() {
        if (instance == null) {
            instance = new FileOperations();
        }
        return instance;
    }
    
    /**
     * Beolvassa a cache fájlt és feldolgozza az adatokat
     * 
     * @return A feltöltött feed-ek tömbje
     * @throws Ha hiba történt a feldolgozás során, akkor eldobjuk, és a
     * hívásnál kezeljük le
     */
    public ArrayList<RSSFeed> read() throws FileNotFoundException {
        return RSSParser.parseRSSFeedsFromFile(file);
    }
    
    /**
     * Lementi fájlba a memóriában található olvasatlan bejegyzéseket
     * 
     * @param feeds Az aktuális feed-ek tömbje
     */
    public void write(ArrayList<RSSFeed> feeds) {
        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            Document doc = docBuilder.newDocument();
            doc.setXmlStandalone(true);
            Element rootElement = doc.createElement("channels");
            doc.appendChild(rootElement);
            
            for (RSSFeed feed : feeds) {
                Element channel = doc.createElement("channel");
                
                Element title = doc.createElement("title");
                title.appendChild(doc.createTextNode(feed.getTitle()));
                channel.appendChild(title);
                Element link = doc.createElement("link");
                link.appendChild(doc.createTextNode(feed.getLink()));
                channel.appendChild(link);
                Element feedURL = doc.createElement("feedurl");
                feedURL.appendChild(doc.createTextNode(feed.getFeedURL().toString()));
                channel.appendChild(feedURL);
                Element isfavourite = doc.createElement("isfavourite");
                isfavourite.appendChild(doc.createTextNode((feed.isFavourite())?"true":"false"));
                channel.appendChild(isfavourite);
                
                if (feed.hasLogo()) {
                    Element image = doc.createElement("image");
                    
                    Element imgTitle = doc.createElement("title");
                    imgTitle.appendChild(doc.createTextNode(feed.getLogo().getTitle()));
                    image.appendChild(imgTitle);
                    Element imgLink = doc.createElement("link");
                    imgLink.appendChild(doc.createTextNode(feed.getLogo().getLink()));
                    image.appendChild(imgLink);
                    Element imgURL = doc.createElement("url");
                    imgURL.appendChild(doc.createTextNode(feed.getLogo().getUrl()));
                    image.appendChild(imgURL);
                    
                    channel.appendChild(image);
                }
                
                for (RSSEntry entry : feed.getEntries()) {
//                    if (!entry.isIsRead()) { //kiszedtem, hogy az olvasottakat is eltárolja, így visszamenőleg is fogja tudni, hogy már mi olvasott
                        Element item = doc.createElement("item");

                        Element entryTitle = doc.createElement("title");
                        entryTitle.appendChild(doc.createTextNode(entry.getTitle()));
                        item.appendChild(entryTitle);
                        Element entryLink = doc.createElement("link");
                        entryLink.appendChild(doc.createTextNode(entry.getLink()));
                        item.appendChild(entryLink);
                        Element pubDate = doc.createElement("pubDate");
                        SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
                        pubDate.appendChild(doc.createTextNode(sdf.format(entry.getPubDate())));
                        item.appendChild(pubDate);
                        Element dcCreator = doc.createElement("dc:creator");
                        dcCreator.appendChild(doc.createTextNode(entry.getAuthor()));
                        item.appendChild(dcCreator);
                        Element description = doc.createElement("description");
                        description.appendChild(doc.createTextNode(entry.getDescription()));
                        item.appendChild(description);
                        Element isread = doc.createElement("isread");
                        isread.appendChild(doc.createTextNode((entry.isIsRead())?"true":"false"));
                        item.appendChild(isread);

                        channel.appendChild(item);
//                    }
                }
                
                rootElement.appendChild(channel);
            }

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(this.file);
//            StreamResult result = new StreamResult(System.out); //console test

            transformer.transform(source, result);

            System.out.println("File saved!");
        } catch (Exception ex) {
            System.err.println("File save error!");
        }
    }
    
}
